import pandas as pd
from datetime import datetime


def get_age_from_idcard(idcard):
    """
    根据身份证号获取年龄。身份证号需要是18位。
    :param idcard: 身份证号
    :return: 年龄
    """
    # 提取出生年份（身份证号第7到第10位）
    birth_year = int(idcard[6:10])

    # 提取出生月份和日期（身份证号第11到第12位为月份，第13到第14位为日期）
    birth_month = int(idcard[10:12])
    birth_day = int(idcard[12:14])

    # 获取当前日期
    current_date = datetime.now()

    # 计算年龄
    age = current_date.year - birth_year

    # 判断是否已经过了生日，如果没有过生日则减去1
    if current_date.month < birth_month or (current_date.month == birth_month and current_date.day < birth_day):
        age -= 1

    return age


def error1(df, styles_df, column1, column2, column3, column4):
    """
    在Excel文件中的指定列下，比较每一行的两个单元格中的数据，如果不符合规则，则把这两个单元格都标黄。

    :param df: 原始数据 DataFrame
    :param styles_df: 样式 DataFrame，用于设置 Excel 格式
    :param column1: 收缩压列名
    :param column2: 舒张压列名
    :param column3: 随访分类列名
    :param column4: 身份证号列名
    """
    try:
        # 比较规则函数
        def highlight_if_not_correct(row):
            # 获取收缩压、舒张压、随访分类、身份证号
            systolic = row[column1]
            diastolic = row[column2]
            follow_up_category = row[column3]
            idcard = row[column4]

            # 根据身份证号获取年龄
            age = get_age_from_idcard(idcard)

            # 收缩压、舒张压 设置上下限
            if systolic > 180 or systolic < 90:
                # 不符合规则，标橙
                styles_df.loc[row.name, [column1]] = 'background-color: orange'
            if diastolic > 110 or diastolic < 60:
                # 不符合规则，标橙
                styles_df.loc[row.name, [column2]] = 'background-color: orange'

            # 根据年龄判断血压控制标准
            if age < 65:
                if not (systolic < 140 and diastolic < 90):
                    if follow_up_category == "控制满意":
                        # 不符合规则，标黄
                        styles_df.loc[row.name, [column1, column2, column3]] = 'background-color: yellow'
            else:
                if not (systolic < 150 and diastolic < 90):
                    if follow_up_category == "控制满意":
                        # 不符合规则，标黄
                        styles_df.loc[row.name, [column1, column2, column3]] = 'background-color: yellow'

            return [''] * len(row)

        # 应用样式
        df.apply(highlight_if_not_correct, axis=1)
        print("[血压]已完成处理。")

    except Exception as e:
        print(f"血压处理时发生错误：{e}")
